/**
 * Klasse Ebook erbt von Printmedium. Stellt die Variablen fuer alle 
 * Daten des Ebooks zur Verfuegung.
 * 
 * Alle Methoden mit setze...() weisen einer Variablen einen Wert zu.
 * Alle gib...() Methoden liefern den Wert der jeweiligen Variablen
 * zurueck. Alle ...Hinzufuegen Methoden fuegen einen Wert einer Liste 
 * hinzu.
 * 
 * Datei: Ebook.java         		Autor: Simon Schindelmann 
 * Datum: 06.11.11                 	Version: 0.3
 *
 * Historie:
 * 06.11.11:  v0.1    Klasse wurde angelegt.
 * 15.12.11   v0.2    gibAutorenListeString () Methode angelegt um die
 *                    Namen der Autoren als String zurueck zugeben.
 * 25.12.11:  v0.3    ISBN Methode geaendert. Prueft nun ob die selbe
 *                    ISBN schon vorhanden ist.
 * 
 * 
 */

package medienverwaltung;

import java.util.*;
import medienverwaltung.simulation.Uebersetzung;
import basis.idnr.ISBN;
import personenverwaltung.Person;

public class Ebook extends Printmedium 
{
  private static final long serialVersionUID = 1096916999764837031L;
  // Speichert die aktuelle Sprache die verwendet wird.
  private Uebersetzung uebersetzung = Uebersetzung.gibSprache ();
  private long dateigroesse;
  private String serie;
  private ISBN isbn13;
  private ArrayList<Person> autorenListe = new ArrayList<Person> ();


  public Ebook (String titel, String datum, Abmessung abmessung,
      String isbn13) throws KeinDatumFormat, VergebeneISBNAusnahme
  {
    super (titel, datum, abmessung);
   
   setzeISBN (isbn13, gibMediumId());
   initial = "EB";
  }


  public Ebook (String titel, String datum, Abmessung abmessung,
      String verlag, String ausgabe, String isbn13, String autoren)
      throws NameEnthaeltZahlenSonderzeichen, KeinDatumFormat, 
      VergebeneISBNAusnahme
  {
    super (titel, datum, abmessung, verlag, ausgabe);
    
    setzeISBN (isbn13, gibMediumId());
    autorenSetzen (autoren);
    initial = "EB";
  }


  /**
   * Der String mit den Autoren wird hier uebergeben. Der String wird
   * von einer Namenparser-Methode zerteilt und eine ArrayList wird
   * zurueck geliefert. Die Enthaelt pro Namen ein Array. Das Array
   * enthaelt jeden Teilnamen des kompletten Namens. Dann werden die
   * namen in den Arrays bis zur vorletzten Stelle im String vorname
   * gespeichert und der letzte Arraywert ist der Nachname der wird im
   * String nachname gespeichert. Aus den beiden Strings kann dann ein
   * Objekt Person erzeugt werden und der autorListe hinzugefuegt
   * werden.
   * 
   * @param autoren Hier wird ein String mit Autorennamen uebergeben.
   * @NameEnthealtZahlen
   */
  private void autorenSetzen (String autoren) 
  	throws NameEnthaeltZahlenSonderzeichen
  {
    ArrayList<String[]> temp = new ArrayList<String[]> ();
    temp = NamenParser.parsen (autoren);
    String[] buffer;
    Person p;

    for (int i = 0; i < temp.size (); i++)
    {
      buffer = temp.get (i);
      String vorname = null;
      String nachname = null;

      for (int j = 0; j < buffer.length; j++)
      {
        if (j < (buffer.length - 1))
        {
          vorname = "" + buffer[j];
        }
        else
        {
          nachname = "" + buffer[j];
        }
      }
      p = new Person (vorname, nachname);
      autorenListe.add (p);
    }
  }

  
  /**
   * Speichert die Namen der Autoren des Ebooks. 
   * @param autoren Name der Autoren des Ebooks.
   * @throws NameEnthaeltZahlenSonderzeichen
   */
  public void autorenHinzufuegen (String autoren)
      throws NameEnthaeltZahlenSonderzeichen
  {
    autorenListe.clear ();
    autorenSetzen (autoren);
  }


  /**
   * Speichert die groesse des Ebooks.
   * @param groesse Groesse des Ebooks.
   */
  public void setzeDateigroesse (long groesse)
  {
    dateigroesse = groesse;
  }

  
  /**
   * Speichert die Serie des Buchs.
   * @param serie Serie des Buchs.
   */
  public void setzeSerie (String serie)
  {
    this.serie = serie;
  }

  
  /**
   * Gibt die ISBN des Ebooks zurueck.
   * @return ISBN des Ebook.
   */
  public ISBN gibISBN ()
  {
    return isbn13;
  }

  
  /**
   * Gibt die Dateigroesse des Ebooks zurueck.
   * @return Dateigroesse des Ebooks.
   */
  public long gibDateigroesse ()
  {
    return dateigroesse;
  }

  
  /**
   * Gibt die Serie des Ebooks zurueck. 
   * @return Serie des Ebooks.
   */
  public String gibSerie ()
  {
    return serie;
  }

  
  /**
   * Gibt die eine Liste mit den Autoren des Ebooks zurueck.
   * @return ArrayListe mit den Autoren.
   */
  public ArrayList<Person> gibAutoren ()
  {
    return autorenListe;
  }
  
  
  /**
   * Gibt die Namen der Autoren in einem String zurueck.
   * @return String mit den Namen der Autoren.
   */
  public String gibAutorenListeString ()
  {
    String autoren = "";
    for (int i = 0; i < autorenListe.size (); i++)
    {
      Person b = autorenListe.get (i);
      if (i < (autorenListe.size () - 1))
      {
        autoren = autoren + "" + b.gibVornamen () + " "
            + b.gibNachname () + ", ";
      }
      else
      {
        autoren = autoren + "" + b.gibVornamen () + " "
            + b.gibNachname ();
      }
    }
    return autoren;
  }
  
  
  /**
   * Hier wird die ISBN des Ebooks gesetzt.
   * @param isbn String der die ISBN enthaelt die gesetzt werden soll.
   * @param id ID des Ebooks um zu vermeiden, dass bei der Pruefung ob 
   * es diese ISBN schon gibt, bei dem Ebook der die ISBN setzen will 
   * eine Ausnahme geworfen wird.
   * @throws VergebeneISBNAusnahme wird geworfen wenn ein anderes Medium
   * diese ISBN schon besitzt.
   */
  public void setzeISBN (String isbn, int id) 
  	throws VergebeneISBNAusnahme
  {
    ISBN tmp = new ISBN (isbn);
    Mediumverwalter mv = new Mediumverwalter ();
    // Wird auf true gesetzt wenn ein Medium die gleiche ISBN hat.
    boolean vorhanden = false;
    // Im Medium mu wird das Medium gespeichert was die selbe ISBN hat.
    Medium mu = null;

    // Es werden die ISBNs aller Medien geprueft die eine ISBN besitzen.
    for (Medium m : mv.gibMedienListe ())
    {
      if (m.gibInitial ().equals ("EB"))
      {
        Ebook e = (Ebook) m;
        if (e.gibISBN ().toString ().equals (tmp.toString ())
            && e.gibMediumId () != id)
        {
          vorhanden = true;
          mu = m;
        }
      }
      if (m.gibInitial ().equals ("BU"))
      {
        Buch b = (Buch) m;
        if (b.gibISBN ().toString ().equals (tmp.toString ())
            && b.gibMediumId () != id)
        {
          vorhanden = true;
          mu = m;
        }
      }
      if (m.gibInitial ().equals ("HB"))
      {
        Hoerbuch h = (Hoerbuch) m;
        if (h.gibIsbn13 ().toString ().equals (tmp.toString ())
            && h.gibMediumId () != id)
        {
          vorhanden = true;
          mu = m;
        }
      }
    }
    
    /*
     * Wenn kein Medium gefunden wurde, das die selbe ISBN hat wird die
     * ISBN gesetzt. Andernfalls wird eine VergebeneISBNAusnahme 
     * geworfen. Die den Fehler Text enthaelt und die Nr des Mediums das
     * diese ISBN schon hat.
     */
    if (vorhanden == false)
    {
      isbn13 = tmp;
    }
    else
    {
      uebersetzung = Uebersetzung.gibSprache ();
      throw new VergebeneISBNAusnahme (uebersetzung.lokal
          .gibUebersetzung ("Diese ISBN besitzt schon dieses Medium")
          + ":"  + "\n" 
          + uebersetzung.lokal.gibUebersetzung ("MediumNr") + ": "
          + mu.gibMediumId ());
    }
  }
}
